package com.leyou.order.scheduled;


import com.leyou.auth.client.AuthClient;
import com.leyou.order.config.JwtProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 获取当前应用Token的定时任务
 */
@Component
@Slf4j
public class AppTokenScheduled {

    //定义成员变量存入应用的token
    private String token;

    @Autowired
    private AuthClient authClient;

    @Autowired
    private JwtProperties jwtProps;

    /**
     * token刷新间隔
     */
    private static final long TOKEN_REFRESH_INTERVAL = 86400000L; //24小时

    /**
     * token获取失败后重试的间隔
     */
    private static final long TOKEN_RETRY_INTERVAL = 10000L;

    /**
     * 需求：每隔24小时定时调用授权中心，获取应用token
     */
    @Scheduled(fixedRate = TOKEN_REFRESH_INTERVAL)
    public void autoGetToken(){
        ///注意：
        // 问题：在远程调用授权中心获取token的时候，可能授权中心不可用，导致失败
        // 解决方案：如果调用失败，隔10秒再重新尝试调用，直接成功为止。

        while(true) {

            try {
                //1.远程调用授权中心，传递服务名称和密钥，获取应用token
                String token = authClient.authorization(
                        jwtProps.getApp().getServiceName(),
                        jwtProps.getApp().getSecret());

                //2.把获取到的token赋值给当前的成员变量
                this.token = token;

                log.info("【服务鉴权】{"+jwtProps.getApp().getServiceName()+"服务成功上线！}");

                //成功则退出循环
                break;
            }catch (Exception e){

                log.error("【服务鉴权】{获取应用token失败，稍后再试!}");
                //代表远程调用失败
                //隔10秒后重新调用
                try {
                    Thread.sleep(TOKEN_RETRY_INTERVAL);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    /**
     * 对外提供获取token的方法
     */
    public String getToken() {
        return token;
    }
}
